/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trunk.model;

import java.io.Serializable;

/**
 * Class Cercle 
 * 
 * Représentation d'un cercle
 * 
 * @author LEFEVRE Michael
 * @author THOUE Jonathan
 */
public class Cercle extends ElementGeo implements Serializable{
 
    /**
     * Attribut de la classe Cercle
     */
    private Point a;
    private int rayon;
    
    /**
     * Constructeur par defaut de Cercle
     */
    public Cercle(){
        this.a = new Point();
        this.rayon = 0;
    }
    /**
     * Surcharge du constructeur de Cercle
     * @param a - Point a de Cercle
     */
    public Cercle(Point a){
        this.a = a.createClone();
        this.rayon = 0;
    }
    /**
     * Surcharge du constructeur de Cercle
     * @param a - Point a de Cercle
     * @param rayon - rayon du Cercle
     */
    public Cercle(Point a,double rayon){
        this.a = a.createClone();
        this.rayon = (int)rayon;
    }
    /**
     * Surcharge du constructeur de Cercle
     * @param a - Point a de Cercle
     * @param b - Point b de Cercle
     */
    public Cercle(Point a,Point b){
        this.a = a.createClone();
        this.rayon = (int)a.distance(b);
    }
    /**
     * Creer un clone de Cercle
     * @return clone de Cercle
     */
    @Override
    public Cercle createClone(){
        return new Cercle(a, rayon);
    }
    /**
     * Creer la symétrie du Cercle
     * @return symetrie du Cercle
     */
    @Override
    public Cercle createSymetrie(){
        return new Cercle(this.a.createSymetrie()) ;
    }
    /**
     *Equals compare deux cercle
     *@param obj - cercle à comparer 
     */
    @Override
    public boolean equals(Object obj){
        return (this.a.equals(((Cercle)obj).getA()));
    }
    /**
     * Get Point a du Cercle
     *@return a 
     */
    public Point getA() {
        return a;
    }
    /**
     *Set Point a du Cercle
     *@param a 
     */
    public void setA(Point a) {
        this.a = a;
    }
    /**
     *Get le rayon de Cercle
     *@return rayon
     */
    public int getRayon() {
        return rayon;
    }
    /**
     *Set le rayon de Cercle
     *@param rayon - Rayon du cercle 
     */
    public void setRayon(int rayon) {
        this.rayon = rayon;
    }
    /**
     *Override de toString
     *@return la valeur du point et du rayon du Cercle
     */
    @Override
    public String toString() {
        return "Cercle{" + this.a +", Rayon="+this.rayon+ "}";
    }
    /**
     * isPointOver vérifie si un point est contenu dans la forme géométrique
     *@param click - point
     *@param marge - marge d'erreur
     */
    @Override
    public boolean isPointOver(Point click, int marge) {        
        return (click.getX()<=this.getA().getX()+marge+rayon && click.getX()>this.getA().getX()-marge-rayon)&&
               (click.getY()<=this.getA().getY()+marge+rayon && click.getY()>this.getA().getY()-marge-rayon);
    }
    /**
     * translateTo déplace la forme géométrique
     *@param diffX - déplacement en X
     *@param diffY - déplacement en Y
     */
    @Override
    public void translateTo(int diffX, int diffY) {
        this.getA().setX(this.getA().getX()+diffX);
        this.getA().setY(this.getA().getY()+diffY);
    }
    /**
     *Creer la symétrie par rapport a o
     *@param o - Origine
     */
    @Override
    public void symetrieO(Point o){
        this.getA().setX( o.getX() -(this.getA().getX()-o.getX()));
        this.getA().setY( o.getY() -(this.getA().getY()-o.getY()));
    }
    /**
     *Creer la symétrie par rapport a X
     *@param o - Origine
     */
    @Override
    public void symetrieX(Point o){
        this.getA().setY( o.getY() -(this.getA().getY()-o.getY()));
    }
    /**
     *Creer la symétrie par rapport a Y
     *@param o - Origine
     */
    @Override
    public void symetrieY(Point o){
        this.getA().setX( o.getX() -(this.getA().getX()-o.getX()));
    }
}
